#pragma once
#ifndef SCRPC_SERVER_H
#define SCRPC_SERVER_H

#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <unordered_map>
#include <functional>
#include <mutex>

#include "common.h"

namespace scRpc {

	class RpcServer
	{
	private:
		/* data */

		// 字段
		muduo::net::TcpServer server_;		// muduo库的TcpServer对象，用于创建和管理TCP服务器
		// key --> 方法名     value --> 处理方法的回调函数
		std::unordered_map<std::string, std::function<nlohmann::json(const nlohmann::json&)>> handlers_;		// 哈希来存储 函数名 <--> 对应处理函数
		std::mutex handlersMutex_;		// 

		// 私有方法
		// 处理客户端的连接事件
		// 连接回调函数，处理客户端连接和断开事件
		void OnConnection(const muduo::net::TcpConnectionPtr& conn);

		// 处理客户端 发送的信息
		// 消息回调函数，处理接收到的消息并根据消息内容调用对应的处理函数
		void OnMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp time);

		// 服务端给客户端 返还响应
		void SendResponse(const muduo::net::TcpConnectionPtr& conn, const RpcResponse& response);
	public:
		// 构造函数，初始化RpcServer实例
    	// loop：事件循环，负责处理异步事件
    	// listenAddr：服务器监听的地址和端口
		RpcServer(muduo::net::EventLoop* loop, const muduo::net::InetAddress& listenAddr, int threadNum = 0);

		// 注册RPC 对应的处理函数
		// method  --> 方法名
		// handler --> 处理函数
		void RegisterHandler(const std::string& method, std::function<nlohmann::json(const nlohmann::json&)> handler);

		// 开启服务器 开始监听 处理客户端的request
		void start();

		virtual ~RpcServer() = default;
	};
	
}

#endif	// SCRPC_SERVER_H